iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
自我挑戰組

Leetcode 自學系列 第 10

自學Leetcode Day10

  • 分享至 

  • xImage
  •  

137. Single Number II

  1. 題目重點:
  • 每個數字都出現 3 次,只有一個數字出現 1 次。

  • 我們要找出這個只出現一次的數字。
    2.解題思路:位元統計法(Bit Counting)

  • 每個整數都是 32-bit(二進位),我們針對這 32 個 bit 中的每一位,統計這一位上 1 出現的總次數。

  • 因為所有其他數字都是出現 3 次,只有一個數字出現 1 次。
    所以,如果你把所有數字在某個 bit 上的值加起來,然後對 3 取餘數,剩下的就是只出現一次的那個數字的 bit 值。
    3.解釋步驟:
    1.外層迴圈跑 32 次,因為整數是 32 bit。
    2.對於每一個 bit(從第 0 位到第 31 位):

  • 用 bit = 1 << i 把第 i 個位元拿出來。
    
  • 在整個 nums 陣列中統計有多少數字這一位是 1。
    

    3.如果某一位的總和 % 3 != 0,那麼這一位在那個「只出現一次的數字」中是 1。
    4.最後把這些位元組合起來,就是答案。
    特別注意:負數也會正確處理
    因為 Java 使用 二補數(two's complement) 表示負數,這個演算法自然會處理負數的符號位(第 31 位),不需要額外處理。
    4.範例說明:
    題目:找出只出現一次的數
    輸入:nums = [2, 2, 3, 2]
    Step 1:轉換成二進位
    我們只看後5個位元(因為數字不大):

    Decimal Binary (5 bits)


     2         00010
     2         00010
     3         00011
     2         00010
    

    Step 2:統計每一位出現幾次 1
    從右邊第 0 位(最低位)到第 4 位(高位):
    Bit 位數: 4 3 2 1 0
    位置值: 16 8 4 2 1

    數字 2: 0 0 0 1 0
    數字 2: 0 0 0 1 0
    數字 3: 0 0 0 1 1
    數字 2: 0 0 0 1 0

    出現次數: 0 0 0 4 1
    對 3 取餘: 0 0 0 1 1

    Step 3:組合出結果的二進位
    Bit 位數: 4 3 2 1 0
    值(%3): 0 0 0 1 1

    結果二進位: 00011
    十進位值: 3
    最終結果:3(這就是只出現一次的那個數)
    圖解總結
    對每一個位元做:
    統計所有數字在該位上的 1 的次數
    對 3 取餘(因為其他數字都出現 3 次)
    組合成只出現一次的數字
    5.程式碼截圖:https://ithelp.ithome.com.tw/upload/images/20250923/201692416aONQHnRaR.png
    6.學習心得:今天選的題目相對難比較多,因為這類型的題目我之前上課沒有做過,但在AI的協助下,讓我對這類型的題目更加熟悉,當然我這次也是請AI提示我,而不是馬上就給我答案,當然這樣的練習可以讓我自己去思考看看題目的解題方向是什麼。


上一篇
自學Leetcode Day9
下一篇
自學Leetcode Day11
系列文
Leetcode 自學11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言